/*********************************************
 * @autheur : CHOLLET Clément                *
 * @date    : 03.04.2013                     *
 * @version : 1.0 - Création de la classe    *
 *********************************************/
#include "lumiere.h"

//-----------------------------------------------------Constructeurs et destructeurs-----------------------------------------------------//
/****************************************************************************
 * Constructeur par défault pour la sérialisation                           *
 ****************************************************************************/
Lumiere::Lumiere()
{
    //TODO : ne rien mettre, constructeur privé pour la sérialisation
}

/****************************************************************************
 * Constructeur avec paramètres                                             *
 * @param nom : numero de la lumière (GL_LIGHT1)                            *
 ****************************************************************************/
Lumiere::Lumiere(GLint numero)
    : _numero(numero)
{
    _couleurAmbiante[0] = 0.2f;
    _couleurAmbiante[1] = 0.2f;
    _couleurAmbiante[2] = 0.2f;
    _couleurAmbiante[3] = 1.0f;

    _couleurDiffuse[0] = 0.8f;
    _couleurDiffuse[1] = 0.8f;
    _couleurDiffuse[2] = 0.8f;
    _couleurDiffuse[3] = 1.0f;

    _couleurSpeculaire[0] = 0.0f;
    _couleurSpeculaire[1] = 0.0f;
    _couleurSpeculaire[2] = 0.0f;
    _couleurSpeculaire[3] = 1.0f;

    _brillanceSpeculaire = 0.0f;

    _positionLumiere[0] = 0.0;
    _positionLumiere[1] = 0.0;
    _positionLumiere[2] = 1.0;
    _positionLumiere[3] = 0.0;

    _direction[0] = 0.0f;
    _direction[1] = 0.0f;
    _direction[2] = -1.0f;

    _concentrationSpot = 0.0f;
    _rayonSpot = 180.0f;

    _enable = false;
}

/****************************************************************************
 * Destructeur                                                              *
 ****************************************************************************/
Lumiere::~Lumiere()
{

}

//---------------------------------------------------------------Méthodes----------------------------------------------------------------//

/****************************************************************************
 * Activation d'une lumière                                                 *
 ****************************************************************************/
void Lumiere::enable()
{
    glEnable(_numero);

    glLightfv(_numero, GL_AMBIENT, _couleurAmbiante);
    glLightfv(_numero, GL_SPECULAR, _couleurSpeculaire);
    glLightfv(_numero, GL_DIFFUSE, _couleurDiffuse);
    glLightfv(_numero, GL_POSITION, _positionLumiere);

    _enable = true;
}

/****************************************************************************
 *  Désactivation d'une lumière                                             *
 ****************************************************************************/
void Lumiere::disable()
{
    glDisable(_numero);

    _enable = false;
}

//---------------------------------------------------------------Accesseurs--------------------------------------------------------------//

/********************************************
 *  On affecte num à la variable _numero    *
 *  @param num : nouvelle valeur de _numero *
 ********************************************/
void Lumiere::setNomLumiere(GLint num)
{
    _numero = num;
}

/****************************************************************************************
 * On affecte les valeurs RGBA  à la variable _couleurAmbiante                          *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurAmbiante *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurAmbiante  *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurAmbiante  *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurAmbiante     *
 ****************************************************************************************/
void Lumiere::setCouleurAmbiante(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha)
{
    _couleurAmbiante[0] = rouge;
    _couleurAmbiante[1] = vert;
    _couleurAmbiante[2] = bleu;
    _couleurAmbiante[3] = alpha;

    glLightfv(_numero, GL_AMBIENT, _couleurAmbiante);
}

/****************************************************************************************
 * On affecte les valeurs RGBA  à la variable _couleurDiffuse                           *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurDiffuse  *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurDiffuse   *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurDiffuse   *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurDiffuse      *
 ****************************************************************************************/
void Lumiere::setCouleurDiffuse(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha)
{
    _couleurDiffuse[0] = rouge;
    _couleurDiffuse[1] = vert;
    _couleurDiffuse[2] = bleu;
    _couleurDiffuse[3] = alpha;

    glLightfv(_numero, GL_DIFFUSE, _couleurDiffuse);
}

/******************************************************************************************
 * On affecte les valeurs RGBA  à la variable _couleurSpeculaire                          *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurSpeculaire *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurSpeculaire  *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurSpeculaire  *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurSpeculaire     *
 ******************************************************************************************/
void Lumiere::setCouleurSpeculaire(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha)
{
    _couleurSpeculaire[0] = rouge;
    _couleurSpeculaire[1] = vert;
    _couleurSpeculaire[2] = bleu;
    _couleurSpeculaire[3] = alpha;

    glLightfv(_numero, GL_SPECULAR, _couleurSpeculaire);
}

/*****************************************************************************************************
 * On affecte les valeurs RGBA à la variable _couleurReflectionSpeculaire                            *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurReflectionSpeculaire  *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurReflectionSpeculaire   *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurReflectionSpeculaire   *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurReflectionSpeculaire      *
 *****************************************************************************************************/
void Lumiere::setCouleurReflectionSpeculaire(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha)
{
    _couleurReflectionSpeculaire[0] = rouge;
    _couleurReflectionSpeculaire[1] = vert;
    _couleurReflectionSpeculaire[2] = bleu;
    _couleurReflectionSpeculaire[3] = alpha;

}

/************************************************************************************
 * On affecte les coordonnées x,y,z,w à la variable _positionLumiere                *
 * @param x : nouvelle valeur de la coordonnée en x de la variable _positionLumiere *
 * @param y : nouvelle valeur de la coordonnée en y de la variable _positionLumiere *
 * @param z : nouvelle valeur de la coordonnée en z de la variable _positionLumiere *
 * @param w : nouvelle valeur de la coordonnée en w de la variable _positionLumiere *
 ************************************************************************************/
void Lumiere::setPositionLumiere(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
    _positionLumiere[0] = x;
    _positionLumiere[1] = y;
    _positionLumiere[2] = z;
    _positionLumiere[3] = w;

    glLightfv(_numero, GL_POSITION, _positionLumiere);
}

/******************************************************************************
 * On affecte les coordonnées x,y,z,w à la variable _direction                *
 * @param x : nouvelle valeur de la coordonnée en x de la variable _direction *
 * @param y : nouvelle valeur de la coordonnée en y de la variable _direction *
 * @param z : nouvelle valeur de la coordonnée en z de la variable _direction *
 ******************************************************************************/
void Lumiere::setDirection(GLfloat x, GLfloat y, GLfloat z)
{
    _direction[0] = x;
    _direction[1] = y;
    _direction[2] = z;
}

/*********************************************************************
 *  On affecte concentrationSpot à la variable _concentrationSpot    *
 *  @param concentrationSpot : nouvelle valeur de _concentrationSpot *
 *********************************************************************/
void Lumiere::setConcentrationSpot(GLfloat concentrationSpot)
{
    _concentrationSpot = concentrationSpot;
}

/*****************************************************
 *  On affecte rayonSpot à la variable _rayonSpot    *
 *  @param rayonSpot : nouvelle valeur de _rayonSpot *
 *****************************************************/
void Lumiere::setRayonSpot(GLfloat rayonSpot)
{
    _rayonSpot = rayonSpot;
}

/*****************************************************
 *  On renvoie si la lumière est active ou non       *
 *  @return bool : true si la lumiere est allumée    *
 *****************************************************/
bool Lumiere::estActif()
{
    return _enable;
}

/*****************************************************
 *  Accesseur sur la couleur ambiante
 *  @return QColor : la couleur ambiamte
 *****************************************************/
QColor& Lumiere::getCouleurAmbiante()
{
    return *(new QColor(_couleurAmbiante[0]*255, _couleurAmbiante[1]*255, _couleurAmbiante[2]*255, _couleurAmbiante[3]*255));
}

/*****************************************************
 *  Accesseur sur la couleur diffuse
 *  @return QColor : la couleur diffuse
 *****************************************************/
QColor& Lumiere::getCouleurDiffuse()
{
    return *(new QColor(_couleurDiffuse[0]*255, _couleurDiffuse[1]*255, _couleurDiffuse[2]*255, _couleurDiffuse[3]*255));
}

/*****************************************************
 *  Accesseur sur la couleur spéculaire
 *  @return QColor : la couleur spéculaire
 *****************************************************/
QColor& Lumiere::getCouleurSpeculaire()
{
    return *(new QColor(_couleurSpeculaire[0]*255, _couleurSpeculaire[1]*255, _couleurSpeculaire[2]*255, _couleurSpeculaire[3]*255));
}

/*****************************************************
 *  Accesseur sur la couleur de réflexion
 *  @return QColor : la couleur de réflexion
 *****************************************************/
QColor& Lumiere::getCouleurReflexionSpeculaire()
{
    return *(new QColor(_couleurReflectionSpeculaire[0]*255, _couleurReflectionSpeculaire[1]*255, _couleurReflectionSpeculaire[2]*255, _couleurReflectionSpeculaire[3]*255));
}

/*****************************************************
 *  Accesseur sur la position en x
 *  @return float : la position en x
 *****************************************************/
float Lumiere::getPosX()
{
    return _positionLumiere[0];
}

/*****************************************************
 *  Accesseur sur la position en y
 *  @return float : la position en y
 *****************************************************/
float Lumiere::getPosY()
{
    return _positionLumiere[1];
}

/*****************************************************
 *  Accesseur sur la position en z
 *  @return float : la position en z
 *****************************************************/
float Lumiere::getPosZ()
{
    return _positionLumiere[2];
}

/*****************************************************
 *  Accesseur sur la position en w
 *  @return float : la position en w
 *****************************************************/
float Lumiere::getPosW()
{
    return _positionLumiere[3];
}

/*****************************************************
 *  Mutateur sur la position en x
 *  param float : la nouvelle position en x
 *****************************************************/
void Lumiere::setPosX(GLfloat x)
{
    _positionLumiere[0] = x;
    glLightfv(_numero, GL_POSITION, _positionLumiere);
}

/*****************************************************
 *  Mutateur sur la position en y
 *  param float : la nouvelle position en y
 *****************************************************/
void Lumiere::setPosY(GLfloat y)
{
    _positionLumiere[1] = y;
    glLightfv(_numero, GL_POSITION, _positionLumiere);
}

/*****************************************************
 *  Mutateur sur la position en z
 *  param float : la nouvelle position en z
 *****************************************************/
void Lumiere::setPosZ(GLfloat z)
{
    _positionLumiere[2] = z;
    glLightfv(_numero, GL_POSITION, _positionLumiere);
}

/*****************************************************
 *  Mutateur sur la position en w
 *  param float : la nouvelle position en w
 *****************************************************/
void Lumiere::setPosW(GLfloat w)
{
    _positionLumiere[3] = w;
    glLightfv(_numero, GL_POSITION, _positionLumiere);
}

//------------------------------------------------------Surcharge des opérateurs---------------------------------------------------------//


